package com.tlias.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.tlias.entity.PageBean;
import com.tlias.entity.Student;
import com.tlias.entity.StudentQueryParam;
import com.tlias.mapper.StudentMapper;
import com.tlias.service.StudentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;

@Slf4j
@Service
public class StudentServiceLImpl implements StudentService {
    @Autowired
    private StudentMapper studentMapper;

    //  分页查询
    @Override
    public PageBean clazzList(StudentQueryParam param) {
        log.info("获取所有班级信息: {} {} {} {} {}",param.getPage(), param.getPageSize(), param.getName(), param.getDegree(),param.getClazzId());
        PageHelper.startPage(param.getPage(), param.getPageSize());
        List<Student> clazzList = studentMapper.clazzList(param);
        Page<Student> clazzPage = (Page<Student>) clazzList;
        return new PageBean(clazzPage.getTotal(), clazzPage.getResult());
    }
    //  根据id批量删除学员信息
    @Override
    public void deleteStudent(List<Integer> ids) {
        log.info("批量删除学员信息:{}", ids);
        studentMapper.deleteStudent(ids);
    }

    //  添加学员信息
    @Override
    public void insertStudent(Student student) {
        student.setCreateTime(LocalDateTime.now());
        student.setUpdateTime(LocalDateTime.now());
        log.info("添加学员信息:{}", student);
        studentMapper.insertStudent(student);
    }

    //  根据id查询学员信息
    @Override
    public Student getStudent(Integer id) {
        log.info("根据id查询学员信息:{}", id);
        return studentMapper.getStudent(id);
    }
//  修改学员信息StudentServiceLImpl
    @Transactional//  开启事务(涉及到多个表操作必须要加事务)
    @Override
    public void updateStudent(Student student) {
        // 1. 【重要】根据ID从数据库中查询出修改前的学生数据
        Student oldStudent = studentMapper.getById(student.getId());
        // 如果查询不到，可以根据业务抛出异常或进行其他处理
        if (oldStudent == null) {
            // 例如: throw new BusinessException("要修改的学员不存在");
            return;
        }
        // 提取旧的班级ID和请求中传入的新的班级ID
        Integer oldClazzId = oldStudent.getClazzId();
        Integer newClazzId = student.getClazzId();

        // 2. 执行学生基本信息的更新 (Mapper中的updateStudent)
        student.setUpdateTime(LocalDateTime.now());
        studentMapper.updateStudent(student);
        log.info("已完成学员基本信息更新:{}", student);

        // 3. 【核心逻辑】判断班级是否发生变更
        // 使用Objects.equals可以安全地处理null值情况
        if (!java.util.Objects.equals(oldClazzId, newClazzId)) {
            log.info("学员班级发生变更，旧班级ID: {}, 新班级ID: {}", oldClazzId, newClazzId);

            // 在这里处理班级变更带来的其他业务逻辑
            // 例如：更新旧班级和新班级的学员人数统计

            // 如果旧班级存在，则对旧班级进行操作（如：人数-1）
            if (oldClazzId != null) {
                // 这里需要一个 ClazzMapper 来操作 clazz 表
                // clazzMapper.decreaseStudentCount(oldClazzId);
                log.info("处理旧班级 {} 的相关业务", oldClazzId);
            }

            // 如果新班级存在，则对新班级进行操作（如：人数+1）
            if (newClazzId != null) {
                // clazzMapper.increaseStudentCount(newClazzId);
                log.info("处理新班级 {} 的相关业务", newClazzId);
            }
        }
    }
//  修改学员违规信息
    @Override
    public void updateStudentViolation(Integer id, Short score) {
        log.info("修改学员违规信息:{}", id);
        studentMapper.updateStudentViolation(id, score);
    }
}
